package com.coding.util;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

public class Md5Utils {

    /**
     * 生成随机盐值
     * @param saltLength 盐值长度
     * @return 随机盐值字符串
     */
    // 生成随机盐
    public static String generateSalt(int saltLength) {
        // 创建随机数生成器
        Random random = new Random();
        // 创建StringBuilder对象，用于存储盐
        StringBuilder salt = new StringBuilder(saltLength);
        // 循环生成随机字符
        for (int i = 0; i < saltLength; i++) {
            // 生成ASCII范围内的随机字符
            int randomChar = (random.nextInt(122 - 33) + 33);
            // 将随机字符添加到盐中
            salt.append((char) randomChar);
        }
        // 返回生成的盐
        return salt.toString();
    }



    /**
     * 对明文密码和盐值进行MD5加盐加密
     * @param plaintextPassword 明文密码
     * @param salt 盐值
     * @return 加盐加密后的MD5密文
     */
    public static String encryptWithMD5AndSalt(String plaintextPassword, String salt) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 先将盐值和明文密码拼接
            String combined = plaintextPassword + salt;
            // 计算拼接后的MD5哈希值
            byte[] hashBytes = md.digest(combined.getBytes(StandardCharsets.UTF_8));
            // 将哈希字节数组转换为十六进制字符串
            return String.format("%032x", new BigInteger(1, hashBytes));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 algorithm not available", e);
        }
    }

    /**
     * 验证用户输入的明文密码和存储的加盐MD5密文是否匹配
     * @param plaintextPassword 用户输入的明文密码
     * @param storedSalt 存储的盐值
     * @param storedMD5 加盐加密后的MD5密文（从数据库或其他持久化存储中获取）
     * @return true表示匹配，false表示不匹配
     */
    public static boolean verifyPassword(String plaintextPassword, String storedSalt, String storedMD5) {
        String calculatedMD5 = encryptWithMD5AndSalt(plaintextPassword, storedSalt);
        return calculatedMD5.equals(storedMD5);
    }


}
